/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package slent.iespana.es.Quimica.CreadorReacciones.ControladoresEventos;

import es.iespana.slent.reaccion.*;
import es.iespana.slent.reaccion.Compuesto.Elemento;
import java.awt.FileDialog;
import java.awt.Frame;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import slent.iespana.es.Quimica.CreadorReacciones.PanelEcuacionQuimica;

/**
 *
 * @author slent
 */
public class ControladorAgregarQuitarComponentes {

    public enum Componente {

        REACTIVO, PRODUCTO, COMPUESTO, ELEMENTO
    }
    private Componente componenteAcrear;
    private ObjectFactory fabricaComponentes;
    private Reaccion reaccion;
    private Reactivo reactivoSeleccionado;
    private Producto productoSeleccionado;
    private Compuesto compuestoSeleccionado;
    private Compuesto.Elemento elementoSeleccionado;
    private PanelEcuacionQuimica panel;

    public ControladorAgregarQuitarComponentes(PanelEcuacionQuimica panelEcuacion) {
        this.panel = panelEcuacion;
        fabricaComponentes = new ObjectFactory();
        reaccion = fabricaComponentes.createReaccion();
        reaccion.setEcuacionQuimicaBalanceada(fabricaComponentes.createEcuacionQuimica());
    }

    // <editor-fold defaultstate="collapsed" desc="getters y setters">
    public Reaccion getReaccion() {
        return reaccion;
    }

    public void setReaccion(Reaccion reaccion) {
        this.reaccion = reaccion;
    }

    public Componente getComponenteAcrear() {
        return componenteAcrear;
    }

    public void setComponenteAcrear(Componente componenteAcrear) {
        this.componenteAcrear = componenteAcrear;
    }

    public Compuesto getCompuestoSeleccionado() {
        return compuestoSeleccionado;
    }

    public void setCompuestoSeleccionado(Compuesto compuestoSeleccionado) {
        this.compuestoSeleccionado = compuestoSeleccionado;
    }

    public Elemento getElementoSeleccionado() {
        return elementoSeleccionado;
    }

    public void setElementoSeleccionado(Elemento elementoSeleccionado) {
        this.elementoSeleccionado = elementoSeleccionado;
    }

    public Producto getProductoSeleccionado() {
        return productoSeleccionado;
    }

    public void setProductoSeleccionado(Producto productoSeleccionado) {
        this.productoSeleccionado = productoSeleccionado;
    }

    public Reactivo getReactivoSeleccionado() {
        return reactivoSeleccionado;
    }

    public void setReactivoSeleccionado(Reactivo reactivoSeleccionado) {
        this.reactivoSeleccionado = reactivoSeleccionado;
    }

    // </editor-fold>
    /**
     * Se encarga de mostrar los componentes del componente seleccionado
     * dentro de su respectivo JList
     */
    public void mostrarComponentes() {
    }

    /**
     * Se encarga de volver a null todas las selecciones paa evitar problemas
     */
    public void quitarTodasSelecciones() {
        reactivoSeleccionado = null;
        productoSeleccionado = null;
        compuestoSeleccionado = null;
        elementoSeleccionado = null;
    }

    /**
     * Se encarga de guardar la reacció modelada en un archivo XMl
     */
    public void guardarReaccionEnArchivo() {
        String rutaArchivo = "";

        JFileChooser fileChooser = new JFileChooser();
        if (JFileChooser.APPROVE_OPTION == fileChooser.showSaveDialog(null)) {
            rutaArchivo = fileChooser.getSelectedFile().getAbsolutePath();
        }

        JOptionPane.showMessageDialog(null, rutaArchivo);
        if (rutaArchivo.equals("")) {
            return;
        }

        try {
            JAXBContext ctx = JAXBContext.newInstance(Reaccion.class.getPackage().getName());
            Marshaller m = ctx.createMarshaller();
            m.setProperty("jaxb.formatted.output", true);
            File archivo = new File(rutaArchivo);
            if (archivo.createNewFile()) {
                m.marshal(fabricaComponentes.createReaccion(reaccion), new FileOutputStream(archivo));
            } else {
                JOptionPane.showMessageDialog(null, "Error al crear el archivo");
            }
        } catch (JAXBException jbex) {
        } catch (IOException ioe) {
            System.out.println("Error al crear el archivo");
        }
    }

    public void verCompuestosEnModelo(DefaultListModel modelo) {
        if (reactivoSeleccionado != null) {
            modelo.clear();
            for (Compuesto comp : reactivoSeleccionado.getCompuesto()) {
                modelo.addElement(comp);
            }
        }
        if (productoSeleccionado != null) {
            modelo.clear();
            for (Compuesto comp : productoSeleccionado.getCompuesto()) {
                modelo.addElement(comp);
            }
        }
    }

    public void verElementosModelo(DefaultListModel modelo) {
        if (compuestoSeleccionado != null) {
            modelo.clear();
        }
        for (Elemento elem : compuestoSeleccionado.getElemento()) {
            modelo.addElement(elem);
        }
    }

    /**
     * Se encarga de agregar un componente de cualquier tipo
     */
    public void agregarComponente() {
        switch (componenteAcrear) {
            case REACTIVO:

                break;
            case PRODUCTO:
                break;
            case COMPUESTO:
                break;
            case ELEMENTO:
                break;
            default:
                break;
        }

    }
}
